Today's computing environments, such as desktop, laptop, or server computing devices, and smartphone and computing tablet computing devices, contain multiple levels of complex software packages layered on top of one another or that operate in parallel with one another in ways that may be unknown to a user or operator. The software packages may be made up of hundreds or thousands of components, including sub-components, that each implement a certain functionality or responsibility and that have both intra-package component dependencies as well as inter-package component dependencies. At times, a fault or other problem occurs in such an environment, and it is desirable to determine the component or components responsible for the fault.